#ifndef _IR_AIR_CONDITIONER_H_
#define _IR_AIR_CONDITIONER_H_

#include "esp_err.h"       // ESP32 错误码
#include "driver/rmt_tx.h" // RMT 发送驱动

#define EXAMPLE_IR_RESOLUTION_HZ 1000000 // 1MHz resolution, 1 tick = 1us

typedef enum {
    NEC_PROTOCOL = 0,                          // NEC 协议
    HAIER_YRW02_PROTOCOL, // 海尔ACYRW02协议
    MIDEA_R05D_PROTOCOL,                       // 美的R05D协议
    IR_PROTOCOL_MAX,                           // 未知协议
} ir_protocol_t;
// Forward declare the struct first
typedef struct Air_conditioner_t Air_conditioner_t;
typedef Air_conditioner_t *pAir_conditioner_t;

// Now define the struct with the pointer type
struct Air_conditioner_t {
    ir_protocol_t ir_protocol; //协议
    // 温度控制
    uint8_t (*set_temp)(pAir_conditioner_t pAC, const uint8_t degrees);
    uint8_t (*get_temp)(pAir_conditioner_t pAC);

    // 电源控制
    uint8_t (*set_power)(pAir_conditioner_t pAC, const uint8_t on);
    uint8_t (*get_power)(pAir_conditioner_t pAC);

    // 运行模式
    uint8_t (*set_mode)(pAir_conditioner_t pAC, const uint8_t mode);
    uint8_t (*get_mode)(pAir_conditioner_t pAC);

    // 风速控制
    uint8_t (*set_fan)(pAir_conditioner_t pAC, const uint8_t speed);
    uint8_t (*get_fan)(pAir_conditioner_t pAC);

    // 扩展功能
    uint8_t (*set_extend)(pAir_conditioner_t pAC, const uint8_t extend, uint8_t data);
    uint8_t (*get_extend)(pAir_conditioner_t pAC);
    // 发送数据
    rmt_symbol_word_t *(*send)(pAir_conditioner_t pAC, size_t *len);
    //
    void (*del)(pAir_conditioner_t pAC);
};

pAir_conditioner_t ir_air_conditioner_init(ir_protocol_t ir_protocol, uint8_t tx_gpio_num);

/**
 * 设置空调温度
 * @param air_conditioner 空调设备实例指针
 * @param degrees 目标温度值（通常16-30℃）
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_set_temp(pAir_conditioner_t air_conditioner, const uint8_t degrees);
/**
 * 获取当前空调温度
 * @param air_conditioner 空调设备实例指针
 * @param degrees 输出参数，用于存储当前温度
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_get_temp(pAir_conditioner_t air_conditioner, uint8_t *degrees);

/**
 * 设置空调电源状态
 * @param air_conditioner 空调设备实例指针
 * @param on 电源状态（1:开启，0:关闭）
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_set_power(pAir_conditioner_t air_conditioner, const uint8_t on);
/**
 * 获取空调电源状态
 * @param air_conditioner 空调设备实例指针
 * @param on 输出参数，存储电源状态（1:开启，0:关闭）
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_get_power(pAir_conditioner_t air_conditioner, uint8_t *on);
/**
 * 设置空调运行模式
 * @param air_conditioner 空调设备实例指针
 * @param mode 模式值（0:自动，1:制冷，2:制热，3:送风，4:除湿等）
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_set_mode(pAir_conditioner_t air_conditioner, const uint8_t mode);
/**
 * 获取空调当前运行模式
 * @param air_conditioner 空调设备实例指针
 * @param mode 输出参数，存储当前模式
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_get_mode(pAir_conditioner_t air_conditioner, uint8_t *mode);
/**
 * 设置空调风速
 * @param air_conditioner 空调设备实例指针
 * @param speed 风速等级（0:自动，1:低速，2:中速，3:高速等）
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_set_fan(pAir_conditioner_t air_conditioner, const uint8_t speed);

/**
 * 获取空调当前风速
 * @param air_conditioner 空调设备实例指针
 * @param speed 输出参数，存储当前风速等级
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_get_fan(pAir_conditioner_t air_conditioner, uint8_t *speed);

/**
 * 设置空调扩展功能
 * @param air_conditioner 空调设备实例指针
 * @param extend 扩展功能类型（自定义定义，如0:摆风，1:睡眠模式等）
 * @param data 功能参数（根据扩展功能类型定义）
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_set_extend(pAir_conditioner_t air_conditioner,
                                     const uint8_t extend, uint8_t data);
/**
 * 获取空调扩展功能状态
 * @param air_conditioner 空调设备实例指针
 * @param data 输出参数，存储扩展功能状态数据
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_get_extend(pAir_conditioner_t air_conditioner, uint8_t *data);

/**
 * 发送空调控制指令
 * @param air_conditioner 空调设备实例指针
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_send(pAir_conditioner_t air_conditioner);
/**
 * 释放空调控制相关资源
 * @param air_conditioner 空调设备实例指针
 * @return ESP_OK成功，其他错误码失败
 */
esp_err_t air_conditioner_del(pAir_conditioner_t air_conditioner);

typedef enum {
    AcModeAuto = 0, ///< 自动模式
    AcModeCool = 1, ///< 制冷模式
    AcModeDry = 2,  ///< 除湿模式
    AcModeHeat = 3, ///< 制热模式
    AcModeFan = 4,  ///< 送风模式
} AC_Mode_t;
typedef enum {
    AcFanAuto = 0, ///< 自动风速
    AcFanLow = 1,  ///< 低速风
    AcFanMed = 2,  ///< 中速风
    AcFanHigh = 3, ///< 高速风
}
AC_Fan_t;

#endif /* _IR_AIR_CONDITIONER_H_ */